package com.example.ailiyuncloud.service.Impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.ailiyuncloud.dto.CommodityConfigDto;
import com.example.ailiyuncloud.dto.CommoditySkuByStagesDTO;
import com.example.ailiyuncloud.dto.CommoditySkuDto;
import com.example.ailiyuncloud.mapper.CommoditySkuByStagesMapper;
import com.example.ailiyuncloud.service.CommodityByStagesService;
import com.example.ailiyuncloud.service.CommoditySkuService;
import com.example.ailiyuncloud.vo.AddCommodityByStagesVO;
import com.example.ailiyuncloud.vo.QueryCommodityByStagesVO;
import com.example.ailiyuncloud.vo.QueryCommoditySkuVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static com.example.ailiyuncloud.service.Impl.CommodityOrderServiceImpl.pages;
import static com.example.ailiyuncloud.service.Impl.CommoditySkuServiceImpl.formatter;

/**
 * @Author: lqj
 * @Date: 2024-06-14 14:10:27
 * @Description:
 */
@Slf4j
@Service
public class CommodityByStagesImpl implements CommodityByStagesService {

    @Autowired
    private CommoditySkuByStagesMapper commoditySkuByStagesMapper;

    @Autowired
    private CommoditySkuService commoditySkuService;

    @Autowired
    private RedisTemplate<String, Object> stringRedisTemplate;


    @Override
    @Transactional
    public void addCommodityByStagesService(List<AddCommodityByStagesVO> addCommodityByStagesVOList) {
        if (ObjectUtils.isEmpty(addCommodityByStagesVOList)) {
            throw new RuntimeException("添加商品分期参数为空");
        }
        String format = LocalDate.now().format(formatter);
        List<String> skuId = addCommodityByStagesVOList.stream().distinct()
                .map(AddCommodityByStagesVO::getSkuId)
                .collect(Collectors.toList());
        QueryCommoditySkuVO queryCommoditySkuVO = new QueryCommoditySkuVO();
        queryCommoditySkuVO.setSkuId(skuId);
        IPage<CommoditySkuDto> commoditySkuDtoIPage = commoditySkuService.queryCommoditySkuService(pages, queryCommoditySkuVO);
        if (commoditySkuDtoIPage.getRecords().size() != skuId.size()) {
            throw new RuntimeException("添加商品分期配置错误，请检查");
        }
        Map<String, CommoditySkuDto> commoditySkuDtoMap = commoditySkuDtoIPage.getRecords().stream().collect(Collectors.toMap(CommoditySkuDto::getSkuId, o -> o));
        addCommodityByStagesVOList.forEach(addCommodityByStagesVO -> {
            CommoditySkuDto commoditySkuDto = commoditySkuDtoMap.get(addCommodityByStagesVO.getSkuId());
            CommoditySkuByStagesDTO commoditySkuByStagesDTO = new CommoditySkuByStagesDTO();
            String commodityConfig = String.valueOf(stringRedisTemplate.opsForValue().increment("CommodityConfig" + format, 1));
            commoditySkuByStagesDTO.setById(format + "00000" + commodityConfig);
            commoditySkuByStagesDTO.setSkuId(commoditySkuDto.getSkuId());
            commoditySkuByStagesDTO.setByStagesType(addCommodityByStagesVO.getByStagesType());
            // todo 由机构API校验后再设置
            commoditySkuByStagesDTO.setByStagesInstitutionId(addCommodityByStagesVO.getByStagesInstitutionId());
            commoditySkuByStagesDTO.setByStagesInstitutionName(addCommodityByStagesVO.getByStagesInstitutionName());
            commoditySkuByStagesMapper.insert(commoditySkuByStagesDTO);
        });

    }

    @Override
    public IPage<CommoditySkuByStagesDTO> queryCommodityByStagesService(Page page, QueryCommodityByStagesVO queryCommodityByStagesVO) {
        IPage<CommoditySkuByStagesDTO> getCommoditySkuByStagesMapper = commoditySkuByStagesMapper.getCommoditySkuByStagesMapper(page, queryCommodityByStagesVO);
        return getCommoditySkuByStagesMapper;
    }
}
